AWS GlueジョブをVPC内で実行させる
AWS GlueジョブからVPC内のリソースにアクセスする方法を紹介します。
ポイント
AWS GlueジョブをVPC内で実行させるポイントは以下です。
- コンソールメニューの「データベース→接続」でVPC設定。
- ジョブと接続を関連付ける。
- ENI向けセキュリティグループのインバウンドルールは自己参照させる。
- S3のVPCエンドポイントをゲートウェイ型で作成。
- ジョブの作成画面にはネットワーク設定がないこと
- JDBC接続やデータベース接続しなくても、データベース接続を定義する必要があること
にご注意ください。
やってみた
今回はNATがないVPCのプライベートサブネット内でGlueジョブを実行するものとします。
1. S3用VPCエンドポイントの作成
Glueジョブはスクリプトの取得や実行結果の管理のために、S3アクセスが必要です。
VPCからS3にアクセスできるよう、S3のVPCエンドポイントをゲートウェイ型で作成します。
S3のエンドポイントは
- ゲートウェイ型
- インターフェイス型
の2種類が存在します。
インターフェイス型はプライベートDNS名を利用できず、VPCエンドポイント固有のDNS名を利用する必要があります。 おそらく、この制約のために、インターフェイス型エンドポイントを作成しただけでは、VPC GlueからS3にアクセスできません。 設定をシンプルにするために、ゲートウェイ型エンドポイントを作成します。
2. ジョブ実行ENI用セキュリティグループの作成
Glue ジョブをVPC内で実行する時に利用するネットワークインターフェイス(ENI)向けのセキュリティグループを作成します。
このセキュリティグループでは、自己参照型のインバウンドルール、具体的には、自分自身をソースとする任意のポートの任意のTCPを許可するルールを追加します。
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
すべてのTCP | TCP | 0-65535 | 自分自身のセキュリティグループID |
ENIへの戻りの通信がステートレスなため、このような設定が必要なものと思われます。
3. データベース接続設定の追加
「データベース→接続」から、Glueジョブ実行用の
- VPC
- サブネット
- (オプション)JDBC向けデータベース接続情報
を設定します。
接続プロパティ
JDBCを利用しない場合、「接続タイプ」に「Network」を指定します。
SparkスクリプトからJDBCでデータベース接続する場合、接続情報を定義できます。
同じAWSアカウント内のデータストアにアクセスする場合は、「接続タイプ」で Redshift などのデータベースを選択し、ウィザード形式で JDBC 接続情報を指定できます。
「接続タイプ」で「JDBC」を選択し、直接入力することもできます。
Spark からは catalog_connection
引数にこの接続情報を渡します。
datasink = glueContext.write_dynamic_frame.from_jdbc_conf( frame = dropnullfields, catalog_connection = "DATABASE_CONNECTION_NAME", connection_options = {"dbtable": "table_name", "database": "db_name"}, transformation_ctx = "...")
接続アクセス
「接続アクセス」ではGlueジョブを実行するVPCやサブネットを指定します。
「セキュリティグループ」には、先程作成したセキュリティグループを指定します。
4. 接続確認
「接続」を作成後、「接続のテスト」ボタンから、作成した接続の疎通確認を行います。
「正常にインスタンスに接続されました。」と表示されれば成功です。
エラーになった場合は、次のナレッジを参考に設定を見直してください。
5. ジョブの作成
Glue ジョブを作成し、「接続」画面で先程作成した「接続」を紐付けます。
6. ジョブの実行
ジョブを実行し「実行ステータス」が「Succeeded」となれば成功です。
7. GlueジョブのENIを確認
AWSコンソールの「EC2→ネットワークインターフェイス」からGlueジョブの ENI を確認できます。
GlueジョブのENIは説明欄が「Attached to Glue using role: arn:aws:iam::AWSアカウントID:role/GlueJobRole」となっています。
このENIは「データベース→接続」で指定したものと同じVPC・サブネット・セキュリティグループであることを確認してください。
ENIが利用されないまま一定時間が経過すると、削除されます。
インターネット通信が必要な場合
VPC内で実行するGlueジョブがインターネット通信を必要な場合の構成は次の通りです。
- Glueジョブ用 ENI はパブリックIPが割り当てられないため、NAT を用意
- インターネット向け通信をNATに向ける
- インターネット経由でS3にアクセスできるため、S3 VPCエンドポイントは不要(インターネットを経由せずに AWSリソースへアクセスしたい場合は各種VPCエンドポイントを活用)